package com.example.service.impl;
import com.example.service.CaptchaService;
import com.example.dto.CaptchaDTO;
import com.example.utils.CaptchaUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Slf4j
@Service
@RequiredArgsConstructor
public class CaptchaServiceImpl implements CaptchaService {
    
    private static final long CAPTCHA_EXPIRE_MINUTES = 5;
    
    private final RedisTemplate<String, Object> redisTemplate;
    
    @Override
    public CaptchaDTO generateCaptcha() {
        // 生成随机验证码
        String code = CaptchaUtils.generateRandomCode(4);
        
        // 生成验证码图片
        String captchaImg = CaptchaUtils.generateCaptchaImage(code);
        
        // 生成唯一ID
        String captchaId = UUID.randomUUID().toString();
        
        // 创建DTO对象
        CaptchaDTO captchaDTO = new CaptchaDTO();
        captchaDTO.setCaptchaId(captchaId);
        captchaDTO.setCode(code);
        captchaDTO.setCaptchaImg(captchaImg);
        captchaDTO.setExpireTime(LocalDateTime.now().plusMinutes(CAPTCHA_EXPIRE_MINUTES));
        
        // 将验证码存入Redis，设置过期时间
        redisTemplate.opsForValue().set("captcha:" + captchaId, code, CAPTCHA_EXPIRE_MINUTES, TimeUnit.MINUTES);
        
        // 返回时不包含验证码明文
        captchaDTO.setCode(null);
        return captchaDTO;
    }
    
    @Override
    public boolean verifyCaptcha(String captchaId, String code) {
        if (!StringUtils.hasText(captchaId) || !StringUtils.hasText(code)) {
            return false;
        }
        
        // 从Redis获取验证码
        String redisKey = "captcha:" + captchaId;
        Object redisCode = redisTemplate.opsForValue().get(redisKey);
        
        if (redisCode == null) {
            return false;
        }
        
        // 验证码使用后立即删除，防止重复使用
        redisTemplate.delete(redisKey);
        
        // 验证码不区分大小写
        return code.equalsIgnoreCase(redisCode.toString());
    }
}